{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：Mysql，MongoDB，redis优点缺点\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "这个问题可能会比较偏架构方面，这道题的侧面就好像在问，什么数据库或怎样组合数据库可以解决你的问题？如果在现场面试，面试官可能会想知道你的思路是怎样的？你会去做哪些调研？我们也可以把这道题拆分来问，可以问它们各自的优缺点，或问问两种数据库的区别。\n",
    "\n",
    "答案\n",
    "Mysql 是关系型数据库，持久化存储，存放在磁盘里，功能强大。检索的话，会涉及到一定 IO，数据访问也就慢。\n",
    "\n",
    "优点：\n",
    "\n",
    "体积小、速度快、总体拥有成本低，开源；\n",
    "支持多种操作系统；\n",
    "是开源数据库，提供的接口支持多种语言连接操作\n",
    "Mysql 的核心程序采用完全的多线程编程。线程是轻量级的进程，它可以灵活地为用户提供服务，而不过多的系统资源。用多线程和 C 语言实现的 MySql 能很容易充分利用 CPU；\n",
    "MySql 有一个非常灵活而且安全的权限和口令系统。当客户与MySql服务器连接时，他们之间所有的口令传送被加密，而且 MySql 支持主机认证；\n",
    "支持 ODBC for Windows，支持所有的 ODBC 2.5 函数和其他许多函数，可以用 Access 连接 MySql 服务器，使得应用被扩展；\n",
    "支持大型的数据库，可以方便地支持上千万条记录的数据库。作为一个开放源代码的数据库，可以针对不同的应用进行相应的修改；\n",
    "拥有一个非常快速而且稳定的基于线程的内存分配系统，可以持续使用面不必担心其稳定性。\n",
    "缺点：\n",
    "\n",
    "不支持热备份；\n",
    "MySQL 最大的缺点是其安全系统，主要是复杂而非标准，另外只有到调用 mysqladmin 来重读用户权限时才发生改变；\n",
    "没有一种存储过程( Stored Procedure )语言，这是对习惯于企业级数据库的程序员的最大限制；\n",
    "Redis 是内存数据库，也是非关系型数据库。数据保存在内存中， 速度快;\n",
    "\n",
    "优点：\n",
    "\n",
    "读写性能优异；\n",
    "支持数据持久化，支持 AOF 和 RDB 两种持久化方式；\n",
    "支持主从复制，主机会自动将数据同步到从机, 可以进行读写分离；\n",
    "数据结构丰富：除了支持 string 类型的 value 外，还支持 string，hash，set，list 等数据结构。\n",
    "缺点：\n",
    "\n",
    "Redis 不具备自动容错和恢复功能， 主机从机的宕机都会导致前端部分读写请求失败， 需要等待机器重启或者手动切换前端的 IP 才能恢复.\n",
    "主机宕机，宕机前有部分数据未能及时同步到从机，切换IP后还会引入数据不一致的问题，降低了系统的可用性\n",
    "Redis的主从复制采用全量复制，复制过程中主机会fork出一个子进程对内存做一份快照，并将子进程的内存快照保存为文件发送给从机，这一过程需要确保主机有足够多的空余内存。若快照文件较大，对集群的服务能力会产生较大的影响，而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行，也就是网络波动都会造成主机和从机间的一次全量的数据复制，这对实际的系统运营造成了不小的麻烦。\n",
    "Redis较难支持在线扩容，在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题，运维人员在系统上线时必须确保有足够的空间，这对资源造成了很大的浪费。\n",
    "MongoDB 旨在为 web 应用提供可扩展的高性能数据存储解决方案，是文档型数据库。\n",
    "\n",
    "优点：\n",
    "\n",
    "弱一致性（最终一致），更能保证用户的访问速度文档结构的存储方式，能够更便捷的获取数内置 Gridfs，高效存储二进制大对象（比如照片和视频）；\n",
    "支持复制集、主备、互为主备、自动分片等特性；\n",
    "动态查询；\n",
    "全索引支持扩展到内部对象和内嵌数组；\n",
    "缺点：\n",
    "\n",
    "不支持事务；\n",
    "MongoDB 占用空间过大。\n",
    "拓展\n",
    "没有一种数据库是完美的，如何选择数据库是非常难的一件事。那么，我们需要做的就是通过问不同的问题去了解你的候选项。\n",
    "\n",
    "这是什么类型的数据库？\n",
    "\n",
    "数据库具有多种类型，例如关系型（Postgres），键值型（Redis），列型（HBase），面向文档型（MongoDB，CouchDB）和图形型（Neo4J）。\n",
    "\n",
    "它们的优势在哪里？\n",
    "\n",
    "数据库并不是凭空创建的，它们旨在解决实际用例提出的问题。 例如：在关系型数据库，query的灵活性比数据库的schema的灵活性更为重要；而面向列的数据库的构建非常适合跨多台机器存储大量数据。\n",
    "\n",
    "如何和数据库进行对话？\n",
    "\n",
    "另外，还需要考虑现有的条件，如何和数据库连接起来，目前项目的主要开发语言是否支持？\n",
    "\n",
    "什么样的数据库更突出？\n",
    "\n",
    "任何数据库都将支持写入数据并再次读出。 从一个数据库到另一个数据库，它所做的其他工作差别很大。 有些允许查询任意字段。 有些提供索引以快速查找。 一些查询支持即席查询，而其他查询则必须进行计划。schema是数据库强制执行的严格框架，还是只是一组可以随意重新谈判的准则？ 理解能力和约束条件将帮助您为工作选择合适的数据库\n",
    "\n",
    "效果如何？\n",
    "\n",
    "该数据库如何发挥作用，费用是多少？ 它支持分片吗？ 复制怎么样？ 它是否使用一致的散列均匀地分布数据，还是像数据一样保持在一起？ 该数据库是否已针对读取，写入或其他操作进行了调整？ 您对其调节有多少控制权？\n",
    "\n",
    "如何去缩放？\n",
    "\n",
    "可伸缩性与性能有关。在没有要扩展的上下文的情况下谈论可伸缩性通常是徒劳的。\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}